#define _CRT_SECURE_NO_WARNINGS
#include"slist.h"

SListNode* BuySListNode(SLTDateType x)
{
	SListNode* ret = (SListNode*)malloc(sizeof(SListNode));
	if (ret == NULL)
	{
		perror("BuyNode,fail");
		return ret;
	}
	ret->data = x;
	ret->next = NULL;
	return ret;
}

void SListPrint(SListNode* pl)
{
	SListNode* cur = pl;
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}

void SListPushFront(SListNode** ppl, SLTDateType x)
{
	SListNode* newnode = BuySListNode(x);
	newnode->next = *ppl;
	*ppl = newnode;
}

void SListPushBack(SListNode** ppl, SLTDateType x)
{
	if (*ppl == NULL)
	{
		*ppl = BuySListNode(x);
	}
	else
	{
		SListNode* tail = *ppl;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = BuySListNode(x);
	}
}

void SListPopFront(SListNode** ppl)
{
	assert(*ppl);
	SListNode* del = *ppl;
	*ppl = del->next;
	free(del);
	del = NULL;
}

void SListPopBack(SListNode** ppl)
{
	assert(*ppl);
	if ((*ppl)->next == NULL)
	{
		free(*ppl);
		*ppl = NULL;
	}
	else
	{
		SListNode* tail = *ppl;
		while (tail->next->next != NULL)
		{
			tail = tail->next;
		}
		free(tail->next);
		tail->next = NULL;
	}
}

SListNode* SListFind(SListNode* pl, SLTDateType x)
{
	SListNode* cur = pl;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

void SListInsert(SListNode* pl, SListNode* pos, SLTDateType x)
{
	assert(pos);
	SListNode* newnode = BuySListNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

void SListEraseAfter(SListNode* pos)
{
	assert(pos);
	assert(pos->next);
	SListNode* del = pos->next;
	pos->next = del->next;
	free(del);
	del = NULL;
}

void SListDestroy(SListNode* pl)
{
	SListNode* cur = pl;
	while (cur)
	{
		SListNode* del = cur;
		cur = cur->next;
		free(del);
		del = NULL;
	}
}